﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ATFCodeCS
{
	public class Var
	{
		public int ID { get; set; }
		public string _value { get; set; }
		public short _open { get; set; }
		public Var()
		{
			ID = 0;
			_value = string.Empty;
		}
		public Var(string tmp)
		{
			ID = 0;
			_value = tmp;
		}
		public Var(Var tmp)
		{
			ID = tmp.ID;
			_value = tmp._value;
		}
		public int len()
		{
			return _value.Length;
		}
		public string ToStringFortmatByID()
		{
			StringBuilder str = new StringBuilder();
			str.Append(addTab(this.ID));
			str.Append(this.ToString());
			return str.ToString();
		}
		private string addTab(int n)
		{
			StringBuilder str = new StringBuilder();
			for (int i = 0; i < n; i++)
			{
				str.Append(Define.TAB);
			}
			return str.ToString();
		}
		public override string ToString()
		{
			return this._value.Trim().ToString();
		}
		public bool EqualEnd(Var tmp)
		{
			return this.ToString().Trim().Equals(tmp.ToString());
		}
		public bool Equals(Var tmp)
		{
			if (tmp._value.Equals(this._value))
			{
				return true;
			}
			return EqualStart(tmp);
		}

		public bool EqualStart(Var tmp)
		{
			string t = this.ToString();
			string t1 = tmp.ToString();
			string[] s  = this._value.Split(Define.START);
			if (s.Length < 2) return false;
			if (tmp._value.Length < s[0].Length) return false;
			string s2 = tmp._value.Substring(0, s[0].Length);
			if (s[0].ToString().Equals(s2.ToString())) return true;
			else return false;
		}
		private string getChuoi(Char[] arStr, int start, int end)
		{
			StringBuilder s = new StringBuilder();
			for (int i = start; i < end; i++)
			{
				s = s.Append(arStr[i]);
			}
			return s.ToString();
		}
		/// <summary>
		/// Hàm  căt  đến >
		/// </summary>
		/// <param name="tmp"></param>
		/// <returns></returns>
		public List<Var> catDau(Var tmp)
		{
			List<Var> ds = new List<Var>();
			Char[] ar = tmp._value.ToArray();
			bool flagDoi = false;// " //không có nháy đôi
			//	bool flagDon = false;//' // không có nháy đơn
			int i = 0;
			int istart = 0;
			// chạy từ đầu điến cuối var nếu gặp > thì cắt dòng
			for (; i < ar.Length; i++)
			{
				//bật cờ nháy đôi nếu có thì không làm gì
				//tắt cờ nháy đôi
				if (ar[i].Equals(Define.NHAYDOI.ToString()))
				{
					// nếu không có sổ trái thì bặt hoặc tắt nháy đôi
					if (i == 0)
					{
						flagDoi = (flagDoi == true) ? false : true;
					}
					else if (!ar[i - 1].Equals(Define.SOTRAI.ToString()))
					{
						flagDoi = (flagDoi == true) ? false : true;
					}

				}
				//bật cờ nháy đơn nếu có thì không làm gì
				// tắt cờ nháy đơn
				/*
				if (ar[i].Equals(Define.NHAYDON.ToString()))
				{
					if (i > 0 && !ar[i - 1].Equals(Define.SOTRAI.ToString()))
					{
						flagDon = (flagDon == true) ? false : true;
					}
				}
				*/
				// chưa làm phần nháy đơn
				//cắt dòng  -->thỏa điều kiện không chú thích là dấu > thì cắt dòng (cho đoạng phải trước vào một Var
				if (flagDoi == false && i > 1 && ar[i - 1].Equals(Define.DAULON) && ar[i].Equals(Define.DAUNHO))
				{
					Var t = new Var(getChuoi(ar, istart, i));
					istart = i;// cắt từ điềm này cho lần sau
					ds.Add(t);
				}
			}
			//  chuỗi cuối chưa được thêm thì thêm vào

			Var tt = new Var(getChuoi(ar, istart, i));
			if (tt._value.Trim().Length > 0)
			{
				ds.Add(tt);
			}

			return ds;
		}
		public List<Var> catLanNua(Var tmp)
		{
			List<Var> ds = new List<Var>();
			Char[] ar = tmp._value.ToArray();
			bool flag1 = true;// "
			bool flag2 = true;//'
			bool flag3 = true;// \
			StringBuilder[] sr = new StringBuilder[3];
			int i = 0;
			for (; i < ar.Length; i++)
			{
				if (ar[i].Equals(Define.NHAYDOI.ToString()))
				{
					if (i > 0 && !ar[i - 1].Equals(Define.SOTRAI.ToString()))
					{
						flag1 = (flag1 == true) ? false : true;
					}
				}
				//if (ar[i].Equals(Define.NHAYDON))
				//{
				//       flag2 = (flag2 == true) ? false : true;
				//}

				if (ar[i].Equals(Define.DAULON) && flag1 && flag2)
				{
					sr[0] = new StringBuilder(getChuoi(ar, 0, i + 1));
					break;
				}
			}
			int itmp = i + 1;
			flag1 = true;// "
			flag2 = true;//'
			int len = ar.Length;
			for (i = len - 1; i >= itmp; i--)
			{
				if (ar[i].Equals(Define.NHAYDOI.ToString()))
				{

					if (i > 0 && !ar[i - 1].Equals(Define.SOTRAI.ToString()))
					{
						flag1 = (flag1 == true) ? false : true;
					}
				}
				//if (ar[i].Equals(Define.NHAYDON))
				//{
				//       flag2 = (flag2 == true) ? false : true;
				//}
				if (ar[i].Equals(Define.DAUNHO) && flag1 && flag2)
				{
					sr[2] = new StringBuilder(getChuoi(ar, i, len));
					break;
				}

			}
			int itmp2 = i;
			sr[1] = new StringBuilder(getChuoi(ar, itmp, itmp2));
			foreach (var item in sr)
			{
				if (item != null && item.ToString().Trim().Length > 0)
				{
					ds.Add(new Var(item.ToString()));
				}
			}
			if (ds.Count == 0)
			{
				ds.Add(tmp);
			}
			return ds;
		}
		/// <summary>
		/// Cắt kết thúc thẻ </
		/// Trả về môt danh sách Var
		/// </summary>
		/// <param name="tmp"></param>
		/// <returns></returns>
		public List<Var> catDuoi(Var tmp)
		{
			List<Var> ds = new List<Var>();
			Char[] ar = tmp._value.ToArray();
			bool flagDoi = false;// " //không có nháy đôi
			//	bool flagDon = false;//' // không có nháy đơn
			int i = 0;
			int istart = 0;
			// chạy từ đầu điến cuối var nếu gặp </ thì cắt dòng
			for (; i < ar.Length; i++)
			{
				//bật cờ nháy đôi nếu có thì không làm gì
				//tắt cờ nháy đôi
				if (ar[i].Equals(Define.NHAYDOI.ToString()))
				{
					// nếu không có sổ trái thì bặt hoặc tắt nháy đôi
					if (i == 0)
					{
						flagDoi = (flagDoi == true) ? false : true;
					}
					else if (!ar[i - 1].Equals(Define.SOTRAI.ToString()))
					{
						flagDoi = (flagDoi == true) ? false : true;
					}

				}
				//bật cờ nháy đơn nếu có thì không làm gì
				// tắt cờ nháy đơn
				/*
				if (ar[i].Equals(Define.NHAYDON.ToString()))
				{
					if (i > 0 && !ar[i - 1].Equals(Define.SOTRAI.ToString()))
					{
						flagDon = (flagDon == true) ? false : true;
					}
				}
				*/
				// chưa làm phần nháy đơn
				//cắt dòng  -->thỏa điều kiện không chú thích là dấu </ thì cắt dòng (cho đoạng phải trước vào một Var
				if (flagDoi == false && i > 1 && ar[i].Equals(Define.SOPHAI) && ar[i - 1].Equals(Define.DAUNHO))
				{
					Var t = new Var(getChuoi(ar, istart, i - 1));
					istart = i - 1;// cắt từ điềm này cho lần sau
					ds.Add(t);
				}
			}
			//  chuỗi cuối chưa được thêm thì thêm vào

			Var tt = new Var(getChuoi(ar, istart, i));
			ds.Add(tt);

			return ds;
		}
		/// <summary>
		/// Cắt kết thúc thẻ {
		/// Trả về môt danh sách Var
		/// </summary>
		/// <param name="tmp"></param>
		/// <returns></returns>
		public List<Var> catNhon(Var tmp)
		{
			List<Var> ds = new List<Var>();
			Char[] ar = tmp._value.ToArray();
			bool flagDoi = false;// " //không có nháy đôi
			//	bool flagDon = false;//' // không có nháy đơn
			int i = 0;
			int istart = 0;
			// chạy từ đầu điến cuối var nếu gặp { } thì cắt dòng
			for (; i < ar.Length; i++)
			{
				//bật cờ nháy đôi nếu có thì không làm gì
				//tắt cờ nháy đôi
				if (ar[i].Equals(Define.NHAYDOI.ToString()))
				{
					// nếu không có sổ trái thì bặt hoặc tắt nháy đôi
					if (i == 0)
					{
						flagDoi = (flagDoi == true) ? false : true;
					}
					else if (!ar[i - 1].Equals(Define.SOTRAI.ToString()))
					{
						flagDoi = (flagDoi == true) ? false : true;
					}
				}
				//debug
				if (ar[i].Equals(Define.NHONMO) || ar[i].Equals(Define.NHONDONG))
				{
				}
				//bật cờ nháy đơn nếu có thì không làm gì
				// tắt cờ nháy đơn
				/*
				if (ar[i].Equals(Define.NHAYDON.ToString()))
				{
					if (i > 0 && !ar[i - 1].Equals(Define.SOTRAI.ToString()))
					{
						flagDon = (flagDon == true) ? false : true;
					}
				}
				*/
				// chưa làm phần nháy đơn
				//cắt dòng  -->thỏa điều kiện không chú thích là dấu </ thì cắt dòng (cho đoạng phải trước vào một Var
				if (flagDoi == false && (ar[i].Equals(Define.NHONMO) || ar[i].Equals(Define.NHONDONG)))
				{
					Var t = new Var(getChuoi(ar, istart, i));
					Var nhon = new Var(getChuoi(ar, i, i + 1));

					istart = i + 1;
					ds.Add(t);
					ds.Add(nhon);
				}
			}
			//  chuỗi cuối chưa được thêm thì thêm vào

			Var tt = new Var(getChuoi(ar, istart, i));
			ds.Add(tt);

			return ds;
		}
	}
}